<?php
/**
 *
 * PaypalAction.class.php
 *
 * ThinkPHP Paypal支付接口模块
 *
 **/
use \PayPal\Api\Payer;
use \PayPal\Api\Item;
use \PayPal\Api\ItemList;
use \PayPal\Api\Details;
use \PayPal\Api\Amount;
use \PayPal\Api\Transaction;
use \PayPal\Api\RedirectUrls;
use \PayPal\Api\Payment;
use \PayPal\Exception\PayPalConnectionException;
class Paypal  {

    /**
     * 自己的paypal账号
     */
//    private $account = 'admin@gmail.com';
    private $account = 'proxy@chinachandelier.com';
//    private $account = '472114016@qq.com';

    /**
     * paypal支付网关地址
     */
    private $gateway = 'https://www.paypal.com/cgi-bin/webscr?';






    public function get_code(){

// 需要填写的设置
        $order['intent']    = 'sale';
        $order['title']     = 'paypal php sdk';
        $order['body']      = 'body';
        $order['currency']  = 'USD';
        $order['price']     = 0.01;
        $order['shipping']  = 8;
        $site['success']    = 'http://127.0.0.1/paypal/return.php?result=success';
        $site['cancel']     = 'http://127.0.0.1/paypal/return.php?result=failed';

        $key['cliend_id']   = 'AQJWlHuCnfKl_VlTv-J_jO9VV5LMGukYGxwv_6awhTbzILCv2Hl8U8vHef5wfMTyQPH103yXnUSxH3fM';
        $key['secret']      = 'EHq5ZSGWb51jOtvz_W5a9vnueWrFf_U86WOuiSJGLwmhHYMTWC2i0LE-tx8I52uL7yQfvqrqVobtu1hZ';


// 支付实例
        $apiContent = new \PayPal\Rest\ApiContext(
            new \PayPal\Auth\OAuthTokenCredential(
                $key['cliend_id'], $key['secret']
            )
        );

        $payer = new Payer();
        $payer->setPaymentMethod('paypal');

        $item = new Item();
        $item->setName($order['title'])
            ->setCurrency($order['currency'])
            ->setQuantity(1)
            ->setPrice($order['price']);

        $itemList = new ItemList();
        $itemList->setItems([$item]);

        $details = new Details();
        $details->setShipping($order['shipping'])
            ->setSubtotal($order['price']);

        $amount = new Amount();
        $amount->setCurrency($order['currency'])
            ->setTotal($order['price'] + $order['shipping'])
            ->setDetails($details);

        $transaction = new Transaction();
        $transaction->setAmount($amount)
            ->setItemList($itemList)
            ->setDescription($order['body'])
            ->setInvoiceNumber(uniqid());

        $redirectUrls = new RedirectUrls();
        $redirectUrls->setReturnUrl($site['success'])
            ->setCancelUrl($site['cancel']);

        $payment = new Payment();
        $payment->setIntent('sale');
        $payment->setPayer($payer)
            ->setRedirectUrls($redirectUrls)
            ->setTransactions([$transaction]);

        try {
            $payment->create($apiContent);
        } catch (PayPalConnectionException $e) {
            // get error by $e->getData();
            return false;
        }

        $pay_url = $payment->getApprovalLink();

// die($pay_url);
        header("Location: " . $pay_url);
    }




    public function get_code1($order_id){
//        $_SERVER['SERVER_NAME'];
         $order=M('order')->where("order_id=$order_id")->find();
         $exchange   =M('exchange_rate')->where(array('id'=>$order['currency']))->find();
         $money_code=$exchange['title'];//收款的币种代号
         $money=$order['order_amount'];//收款金额
        // 初始化准备提交到Paypal的数据
        $pp_info = array();
        // 告诉Paypal，我的网站是用的我自己的购物车系统
        $pp_info['cmd']			= '_xclick';
        // 告诉paypal，我的（商城的商户）Paypal账号，就是这钱是付给谁的
        $pp_info['business']	='proxy@chinachandelier.com';
        // 用户将会在Paypal的支付页面看到购买的是什么东西，只做显示，没有什么特殊用途，
        // 如果是多件商品，则直接告诉用户，只支付某个订单就可以了
        $pp_info['item_name']	= "OrderId：$order_id";
//        $pp_info['amount']		= $order['order_amount']; // 告诉Paypal，我要收多少钱
        $pp_info['amount']		= "0.01"; // 告诉Paypal，我要收多少钱
        $pp_info['currency_code']	="USD"; // 告诉Paypal，我要用什么货币。
//        $pp_info['return'] ='http://www.wawa.com/index.php?m=Home&c=payment&a=finish ';// 当用户成功付款后paypal会将用户自动引导到此页面。 如果为空或不传递该参数，则不会跳转
        $pp_info['return'] ='http://www.wawa.com/index.php/Home/payment/finish ';// 当用户成功付款后paypal会将用户自动引导到此页面。 如果为空或不传递该参数，则不会跳转
        $pp_info['invoice']	= $order_id;
        $pp_info['charset']	= 'utf-8';
        $pp_info['no_shipping']	= '1';
        $pp_info['no_note']	= '1';
        $pp_info['cancel_return']	= 'http//www.wawa.com/index.php/Home/User/order_detail/id/'.$order_id;
//        $pp_info['cancel_return']	= 'http://www.wawa.com/index.php?m=Home&c=Cart&a=cart4&order_id='.$order_id; // 当跳转到paypal付款页面时，用户又突然不想买了。则会跳转到此页面
        // Paypal会将指定 invoice 的订单的状态定时发送到此URL
        // (Paypal的此操作，是paypal的服务器和我方商城的服务器点对点的通信，用户感觉不到）
        $pp_info['notify_url']	= 'http//www.wawa.com/index.php/Home/payment/notify/orderid/'.$order_id;
//        $pp_info['notify_url']	= 'http://www.wawa.com/index.php?m=Home&c=payment&a=notify&orderid=/'.$order_id;
        $pp_info['rm']	= '2';





        $paypal_payment_url = $this->gateway.http_build_query($pp_info);
//        print_r($pp_info);exit;
        unset($pp_info);
        return $paypal_payment_url;

//        echo "<a href='{$paypal_payment_url}'>Go Paypal!</a>";exit;













    }

    /**
     * 生成订单并跳转到Paypal进行支付
     */
    public function order() {
        /**
         * 自己的逻辑代码
         * 判断是否登录、购买的哪个商品、购物车等等逻辑
         * 当然可以调用Model更简单点
         * 这里不在赘述
         */
        /** ...... **/

        $order_info	= array();	// 初始化订单数据
        $order_id	= uniqid();	// 按照自己的规则生成订单号入库

        /**
         * 订单包含哪几种商品、谁买的、什么时间、几件
         */
        $order_info['order_id']		= $order_id;
        $order_info['member_id']	= Session::get('member_id');
        /** .... **/

        $order = D('Order');

        if( $order->createOrder($order_info) ) {
            unset($order,$order_info);
            // 初始化准备提交到Paypal的数据
            $pp_info = array();
            // 告诉Paypal，我的网站是用的我自己的购物车系统
            $pp_info['cmd']			= '_xclick';
            // 告诉paypal，我的（商城的商户）Paypal账号，就是这钱是付给谁的
            $pp_info['business']	= $this->account;
            // 用户将会在Paypal的支付页面看到购买的是什么东西，只做显示，没有什么特殊用途，
            // 如果是多件商品，则直接告诉用户，只支付某个订单就可以了
            $pp_info['item_name']	= "支付订单：{$order_id}";
            $pp_info['amount']		= '13'; // 告诉Paypal，我要收多少钱
            // 告诉Paypal，我要用什么货币。这里需要注意的是，由于汇率问题，
            // 如果网站提供了更改货币的功能，那么上面的amount也要做适当更改，
            // paypal是不会智能的根据汇率更改总额的
            $pp_info['currency_code']	= 'USD';
            // 当用户成功付款后paypal会将用户自动引导到此页面。
            // 如果为空或不传递该参数，则不会跳转
            $pp_info['return'] = 'http//www.wawa.cn/index.php/Home/payment/finish';
            $pp_info['invoice']	= $order_id;
            $pp_info['charset']	= 'utf-8';
            $pp_info['no_shipping']	= '1';
            $pp_info['no_note']	= '1';
            // 当跳转到paypal付款页面时，用户又突然不想买了。则会跳转到此页面
            $pp_info['cancel_return']	= 'http//www.wawa.com/index.php/Home/User/order_detail/id/'.$order_id;
            // Paypal会将指定 invoice 的订单的状态定时发送到此URL
            // (Paypal的此操作，是paypal的服务器和我方商城的服务器点对点的通信，用户感觉不到）
            $pp_info['notify_url']	= 'http//www.wawa.com/index.php/Home/payment/notify/orderid/'.$order_id;
            $pp_info['rm']	= '2';
            $paypal_payment_url = $this->gateway.http_build_query($pp_info);
            echo "<a href='{$paypal_payment_url}'>Go Paypal!</a>";
            unset($pp_info);
        } else {
            $this->error(L('order_create_fail'));
        }
    }

    public function finish() {
        $this->success('购买成功');
    }

    public function notify() {
        // 由于这个文件只有被Paypal的服务器访问，所以无需考虑做什么页面什么的，
        // 这个页面不是给人看的，是给机器看的
        $order_id = (int) $_GET['orderid'];
        $order_info = M('Order')->where("order_id=$order_id")->find();


        update_pay_status($order_info['order_sn']);

//        $order_info = D('Order')->getOrderDetail($order_id);

        // 由于该URL不仅仅只有Paypal的服务器能访问，其他任何服务器都可以向该方法发起请求。
        // 所以要判断请求发起的合法性，也就是要判断请求是否是paypal官方服务器发起的

//        // 拼凑 post 请求数据
//        $req = 'cmd=_notify-validate';// 验证请求
//        foreach ($_POST as $k=>$v){
//            $v = urlencode(stripslashes($v));
//            $req .= "&{$k}={$v}";
//        }
//
//        $ch = curl_init();
//        curl_setopt($ch,CURLOPT_URL,'http://www.paypal.com/cgi-bin/webscr');
//        curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
//        curl_setopt($ch,CURLOPT_POST,1);
//        curl_setopt($ch,CURLOPT_POSTFIELDS,$req);
//        $res = curl_exec($ch);
//        curl_close($ch);
//
//        if( $res && !empty($order_info) ) {
//            // 本次请求是否由Paypal官方的服务器发出的请求
//            if(strcmp($res, 'VERIFIED') == 0) {
//                /**
//                 * 判断订单的状态
//                 * 判断订单的收款人
//                 * 判断订单金额
//                 * 判断货币类型
//                 */
//                if(($_POST['payment_status'] != 'Completed' && $_POST['payment_status'] != 'Pending')
//                    OR ($_POST['receiver_email'] != $this->account)
//                    OR ($_POST['mc_gross'] != 13)
//                    OR ('USD' != $_POST['mc_currency'])) {
//                    // 如果有任意一项成立，则终止执行。由于是给机器看的，所以不用考虑什么页面。直接输出即可
//                    exit('fail');
//                } else {// 如果验证通过，则证明本次请求是合法的
//                    D('Order')->finishOrder($order_id);// 更改订单状态
//                    exit('success');
//                }
//            } else {
//                exit('fail');
//            }
//        }
    }
}

?>